# == Coding: UTF-8 ==
# @Project :        BooksManagementSystem
# @fileName         RandomlyGenerateStudentInformation.py
# @version          v0.6
# @author           Echo
# @GiteeWarehouse   https://gitee.com/liu-long068/
# @editsession      2023/3/30
# @Software:        PyCharm
# ====/******/=====
import json
import random


def generate_name():
    # Generate random name
    first_names = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱',
                   '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢',
                   '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌',
                   '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛',
                   '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅', '皮',
                   '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹', '姚', '邵',
                   '湛', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅',
                   '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁', '杜', '阮', '蓝', '闵', '席', '季', '麻', '强',
                   '贾', '路', '娄', '危', '江', '童', '颜', '郭', '梅', '盛', '林', '刁', '锺', '徐', '丘', '骆', '高',
                   '夏', '蔡', '田', '樊', '胡', '凌', '霍', '虞', '万', '支', '柯', '昝', '管', '卢', '莫', '经', '房',
                   '裘', '缪', '干', '解', '应', '宗', '丁', '宣', '贲', '邓', '郁', '单', '杭', '洪', '包', '诸', '左',
                   '石', '崔', '吉', '钮', '龚', '程', '嵇', '邢', '滑', '裴', '陆', '荣', '翁', '荀', '羊', '於', '惠',
                   '甄', '麹', '家', '封', '芮', '羿', '储', '靳', '汲', '邴', '糜', '松', '井', '段', '富', '巫', '乌',
                   '焦', '巴', '弓', '牧', '隗', '山', '谷', '车', '侯', '宓', '蓬', '全', '郗', '班', '仰', '秋', '仲',
                   '伊', '宫', '甯', '仇', '栾', '暴', '甘', '钭', '厉', '戎', '祖', '武', '符', '刘', '景', '詹', '束',
                   '龙', '叶', '幸', '司', '韶', '郜', '黎', '蓟', '薄', '印', '宿', '白', '怀', '蒲', '邰', '从', '鄂',
                   '索', '咸', '籍', '赖', '卓', '蔺', '屠', '蒙', '池', '乔', '阴', '鬱', '胥', '能', '苍', '双', '闻',
                   '莘', '党', '翟', '谭', '贡', '劳', '逄', '姬', '申', '扶', '堵', '冉', '宰', '郦', '雍', '郤', '璩',
                   '桑', '桂', '濮', '牛', '寿', '通', '边', '扈', '燕', '冀', '郏', '浦', '尚', '农', '温', '别', '庄',
                   '晏', '柴', '瞿', '阎', '充', '慕', '连', '茹', '习', '宦', '艾', '鱼', '容', '向', '古', '易', '慎',
                   '戈', '廖', '庾', '终', '暨', '居', '衡', '步', '都', '耿', '满', '弘', '匡', '国', '文', '寇', '广',
                   '禄', '阙', '东', '欧', '殳', '沃', '利', '蔚', '越', '夔', '隆', '师', '巩', '厍', '聂', '晁', '勾',
                   '敖', '融', '冷', '訾', '辛', '阚', '那', '简', '饶', '空', '曾', '毋', '沙', '乜', '养', '鞠', '须',
                   '丰', '巢', '关', '蒯', '相', '查', '后', '荆', '红', '游', '竺', '权', '逯', '盖', '益', '桓', '公',
                   '万俟', '司马', '上官', '欧阳', '夏侯', '诸葛', '闻人', '东方', '赫连', '皇甫', '尉迟', '公羊',
                   '澹台', '公冶', '宗政', '濮阳', '淳于', '单于', '太叔', '申屠', '公孙', '仲孙', '轩辕', '令狐',
                   '锺离', '宇文', '长孙', '慕容', '鲜于', '闾丘', '司徒', '司空', '亓官', '司寇', '仉', '督', '子车',
                   '颛孙', '端木', '巫马', '公西', '漆雕', '乐正', '壤驷', '公良', '拓跋', '夹谷', '宰父', '穀梁', '晋',
                   '楚', '闫', '法', '汝', '鄢', '涂', '钦', '段干', '百里', '东郭', '南门', '呼延', '归海', '羊舌',
                   '微生', '岳', '帅', '缑', '亢', '况', '後', '有', '琴', '梁丘', '左丘', '东门', '西门', '商', '牟',
                   '佘', '佴', '伯', '赏', '南宫', '墨', '哈', '谯', '笪', '年', '爱', '阳', '佟', '第五', '言', '福']
    last_names = ["伟", "芳", "娜", "秀英", "敏", "静", "丽", "强", "磊", "军",
                  '佳', '彤', '自', '怡', '颖', '宸', '雅', '微', '羽', '馨', '思', '纾', '欣', '元', '凡', '晴', '玥',
                  '宁', '佳', '蕾', '桑', '妍', '萱', '宛',
                  '欣', '灵', '烟', '文', '柏', '艺', '以', '如', '雪', '璐', '言', '婷', '青', '安', '昕', '淑', '雅',
                  '娅', '茹', '嘉', '幻', '辰', '妍', '雨', '蕊', '欣', '芸', '亦', '颖',
                  '云', '艺', '忻', '梓', '江', '丽', '梦', '雪', '沁', '思', '羽', '雅', '访', '烟', '萱', '忆', '慧',
                  ]
    name = random.choice(first_names) + random.choice(last_names)
    return name


def generate_student_id(year):
    if year >= 2019 and year <= 2022:
        return str(year)[2:] + ''.join(random.choice('0123456789') for _ in range(6))
    else:
        raise ValueError("Invalid year")


def generate_college():
    colleges = ['电子与物联网学院', '软件技术学院', '现代制造学院', '智能控制学院', '网络与通信学院']
    return random.choice(colleges)


def generate_major(college):
    majors = {
        '电子与物联网学院': ['电子信息工程技术', '物联网应用技术'],
        '软件技术学院': ['软件技术', '大数据技术应用', '人工智能技术', '数字媒体技术', '动漫制作技术', '虚拟现实技术'],
        '网络与通信学院': ['云计算技术应用', '计算机网络技术', '信息安全技术'],
        '智能控制学院': ['自动化技术', '机器人技术', '电气工程技术'],
        '现代制造学院': ['制造工程技术', '工业设计', '机械自动化技术']
    }
    if college in majors:
        return random.choice(majors[college])
    else:
        raise ValueError("Invalid college")


def generate_class(college, major, student_id):
    year = int(student_id[:2])
    grade = year + 2000
    x = random.choice([1, 2, 3, 4, 5])
    return f"{major}{grade}级{x}班"


def generate_idcard():
    province_code = str(random.randint(11, 91))
    city_code = str(random.randint(00, 99)).zfill(2)
    district_code = str(random.randint(11, 99)).zfill(2)
    birth_year = str(random.randint(1998, 2004))

    birth_month = str(random.randint(1, 12)).zfill(2)

    if birth_month in ['01', '03', '05', '07', '08', '10', '12']:
        birth_day = str(random.randint(1, 31)).zfill(2)
    elif birth_month in ['04', '06', '09', '11']:
        birth_day = str(random.randint(1, 30)).zfill(2)
    else:
        birth_day = str(random.randint(1, 28)).zfill(2)

    sequence_code = str(random.randint(1, 999)).zfill(3)

    id_number = province_code + city_code + district_code + birth_year + birth_month + birth_day + sequence_code
    weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    checksum_dict = {0: '1', 1: '0', 2: 'X', 3: '9', 4: '8', 5: '7', 6: '6', 7: '5', 8: '4', 9: '3', 10: '2'}
    checksum = sum([int(id_number[i]) * weight_factor[i] for i in range(13)]) % 11
    id_number += checksum_dict[checksum]
    return id_number


def generate_gender():
    """ 根据生成的身份证号码判断性别 """
    temp = generate_idcard()
    sex_n = temp[-2]
    if int(sex_n) % 2 == 0:
        return '女'
    else:
        return '男'


def generate_phoneNumber():
    # 生成手机号码前三位
    prefix = random.choice(['130', '131', '132', '133', '134', '135', '136', '137', '138', '139',
                            '150', '151', '152', '153', '155', '156', '157', '158', '159',
                            '180', '181', '182', '183', '184', '185', '186', '187', '188', '189'])
    # 生成手机号码后8位
    suffix = ''.join(str(random.randint(0, 9)) for _ in range(8))
    return prefix + suffix


def save_data_to_json(path):
    """ 写入JSON文件 """
    student_data = []
    generated_ids = set()  # 用于存储已生成的学号
    generated_idcards = set()  # 用于存储已生成的身份证号
    for i in range(5001):
        student_info = {}
        year = random.choice([2019, 2020, 2021, 2022])
        student_id = generate_student_id(year)
        while student_id in generated_ids:  # 检查学号是否已经存在
            student_id = generate_student_id(year)
        generated_ids.add(student_id)  # 将生成的学号添加到集合中
        generated_idcard = generate_idcard()
        while generated_idcard in generated_idcards:  # 检查身份证号是否已经存在
            generated_idcard = generate_idcard()
        generated_idcards.add(generated_idcard)  # 将生成的身份证号添加到集合中
        student_info['学号'] = student_id
        student_info['姓名'] = generate_name()
        student_info['性别'] = generate_gender()
        student_info['身份证号'] = generate_idcard()
        student_info['联系电话'] = generate_phoneNumber()
        student_info['二级学院'] = generate_college()
        student_info['专业'] = generate_major(student_info['二级学院'])
        student_info['班级'] = generate_class(student_info['二级学院'], student_info['专业'], student_info['学号'])
        student_info['状态'] = 1
        student_data.append(student_info)
    sorted_data = sorted(student_data, key=lambda x: x['学号'])
    with open(path, "w", encoding="utf-8") as f:
        json.dump(sorted_data, f, ensure_ascii=False, indent=4)
    print("写入完成。")

# save_data_to_json(r'D:\liulong\BooksManagementSystem\public\users\student.json')
